home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / xml4j.jar / com / ibm / xml / framework / ChunkyByteArray.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-08-30  |  1.4 KB  |  127 lines

  1. package com.ibm.xml.framework;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5.  
  6. public final class ChunkyByteArray extends InputStream {
  7.    private static final int CHUNK_SHIFT = 14;
  8.    private static final int CHUNK_SIZE = 16384;
  9.    private static final int CHUNK_MASK = 16383;
  10.    private static final int INITIAL_CHUNK_COUNT = 64;
  11.    private InputStream fInputStream;
  12.    private byte[][] fData = new byte[64][];
  13.    private int fLength;
  14.    private int fOffset;
  15.  
  16.    public ChunkyByteArray(InputStream var1) throws IOException {
  17.       this.fInputStream = var1;
  18.       this.fill();
  19.    }
  20.  
  21.    public int read() throws IOException {
  22.       if (this.fData == null) {
  23.          return this.fInputStream == null ? -1 : this.fInputStream.read();
  24.       } else {
  25.          byte var1 = this.fData[0][this.fOffset];
  26.          if (++this.fOffset == this.fLength) {
  27.             this.fData = null;
  28.             if (this.fLength < 16384) {
  29.                this.fInputStream = null;
  30.             }
  31.          }
  32.  
  33.          return var1;
  34.       }
  35.    }
  36.  
  37.    public int read(byte[] var1, int var2, int var3) throws IOException {
  38.       int var4 = this.fLength - this.fOffset;
  39.       if (var4 == 0) {
  40.          return this.fInputStream == null ? -1 : this.fInputStream.read(var1, var2, var3);
  41.       } else if (var3 <= 0) {
  42.          return 0;
  43.       } else {
  44.          byte[] var5 = this.fData[0];
  45.          if (var3 >= var4) {
  46.             var3 = var4;
  47.             if (this.fLength < 16384) {
  48.                this.fInputStream = null;
  49.             }
  50.          }
  51.  
  52.          if (var1 == null) {
  53.             this.fOffset += var3;
  54.             return var3;
  55.          } else {
  56.             int var6 = var2 + var3;
  57.  
  58.             do {
  59.                var1[var2++] = var5[this.fOffset++];
  60.             } while(var2 < var6);
  61.  
  62.             return var3;
  63.          }
  64.       }
  65.    }
  66.  
  67.    public void rewind() {
  68.       this.fOffset = 0;
  69.    }
  70.  
  71.    private void fill() throws IOException {
  72.       int var1 = this.fLength >> 14;
  73.       byte[] var2 = new byte[16384];
  74.       this.fData[var1] = var2;
  75.       int var3 = 0;
  76.       int var4 = 16384;
  77.       int var5 = 0;
  78.  
  79.       do {
  80.          var5 = this.fInputStream.read(var2, var3, var4);
  81.          if (var5 == -1) {
  82.             var2[var3] = -1;
  83.             this.fInputStream.close();
  84.             this.fInputStream = null;
  85.             return;
  86.          }
  87.  
  88.          if (var5 > 0) {
  89.             this.fLength += var5;
  90.             var3 += var5;
  91.             var4 -= var5;
  92.          }
  93.       } while(var4 > 0);
  94.  
  95.    }
  96.  
  97.    public byte byteAt(int var1) {
  98.       int var2 = var1 >> 14;
  99.       int var3 = var1 & 16383;
  100.  
  101.       try {
  102.          return this.fData[var2][var3];
  103.       } catch (NullPointerException var5) {
  104.          try {
  105.             if (var3 == 0) {
  106.                this.fill();
  107.                return this.fData[var2][var3];
  108.             } else {
  109.                return 0;
  110.             }
  111.          } catch (IOException var4) {
  112.             return 0;
  113.          }
  114.       }
  115.    }
  116.  
  117.    public boolean atEOF(int var1) {
  118.       return var1 > this.fLength;
  119.    }
  120.  
  121.    public void checkEOF(int var1) {
  122.       if (var1 > this.fLength) {
  123.          throw new ArrayIndexOutOfBoundsException();
  124.       }
  125.    }
  126. }
  127.